// const s = new Set();
// [2,2,3,4,4,5,5].forEach(x => s.add(x))



// console.log(s.delete(5))
// console.log(s)
// s.clear()
// let arr = [...new Set([2,2,3,4,4,5,5])]

// console.log(arr)

let s = new Set([2,2,3,4,4,5,5])
// console.log(s.keys())
// console.log(s.values())
// console.log(s.entries())

// for (let [item, value] of s.entries()) {
//     console.log(`key:${item}, value: ${value}`)
// }

// s.forEach((value, key) => console.log(`key:${key}, value: ${value}`))

//weakSet
// node --expose-gc

// map  
// hash 结构  额外篇数据结构+算法。
// 贪婪算法解决  红中麻将胡牌的癞子算法 （后期在开红中麻将实战课程之前，我会讲）
// 入门：学招式。学做具体的事情。高级：心法（算法）
// 剑宗： 把招式练到极致，重实践。轻理论。实践经验。风清扬
// 气宗： 把内功心法练到极致。重理论
// 知行合一 ：  明朝的大名士，也是儒家的最后一个圣人。王阳明 王守仁。心学
// 为了突出心法的重要性，可以这么说： 软件的核心其实就是 数据结构+算法


//map
// Object 对象提供了  “字符串 --- 值 ”
// map  提供了  “值  --- 值”
// weakMap weakSet 是不可遍历不可以取size
// const m = new Map();
// const o = { p: ' hello world '}

// m.set(o, '这里是附加内容')

// console.log(m.get(o))

// console.log(m.has(o))
// m.delete(o)
// m.clear()
// let wm = new WeakMap();
// wm.set(o, '我是弱引用')

// 1、面向过程
// 2、面向对象
// 3、元编程（meta programming) 对编程语言进行编程 代理和反射


//代理 Proxy  对目标对象之前架设一层“拦截”，对接对该对象访问时候，比通过拦截之后，才可以继续访问。

// function A () {

// }
// let pA = new Proxy(A,{
//     get: function(target, key, receiver) {
//         console.log(`这里是拦截get方法，添加的一些操作。 拦截的key:`, key);
//         return Reflect.get(target,key,receiver);
//     },
//     set: function(target,key,value, receiver) {
//         console.log(`这里是对set方法拦截，添加的一个动作，拦截set的哪个key: ${key}`)
//         return Reflect.set(target,key,value, receiver)
//     },
//     construct: function (target, args) {
//         return {one: '添加的第一个属性'}
//     }
// })

// let a  = new pA();
// console.log(a.one)

// has ,  deleteProperty


// 反射 Reflect 自己写框架的用的比较多。 MVVM （angular vue react)  
// 1、将Object 一些明显属于语言内部的方法，比如 Object.defineProperty ，放在
// Reflect对象上。
// 2、  修改某些Object方法的返回结果，让其变得更合理。比如，Object.defineProperty(obj, name, desc)在无法定义属性时，会抛出一个错误，而Reflect.defineProperty(obj, name, desc)则会返回false。

// try {
//     Object.defineProperty(target, property, attributes)
// } catch (e) {
//     console.log(e)
// }

// if(Reflect.defineProperty(target, property, attributes)) {
//     //正确执行
// } else {
//     // 错误处理
// }
// const o = {
//     count: 1
// }
// console.log(Reflect.has(o,'count'))

let p1 = new Proxy({}, {
    set: function(target,key,value,receiver) {
        let success = Reflect.set(target,key,value,receiver)
        if(success) {
            console.log(`在设置key:${key}这里,添加的操作`)
        }
        return success
    }
})
p1.count = 1;
